﻿using System;

namespace _135_动态绑定_无动态接收者的动态调用
{
    class Program
    {
        static void Main(string[] args)
        {
            //dynamic的标准用例是包含一个动态接收者。这意味着某个动态对象是动态函数调用的接收者：
            /*
            dynamic x = ...;
            x.Foo(); // x是接收者
            */
            //然而，还可以使用动态参数调用已知的静态函数。这种调用受到动态重载解析的影响，并且可能包括：
            //   静态方法
            //   实例构造函数
            //   已知静态类型的接收者的实例方法

            //在下面的例子中，动态获取边界的特殊Foo取决于动态参数的运行时类型：
            dynamic x = 5;
            dynamic y = "watermelon";

            Foo(x); // 1
            Foo(y); // 2
            //因为其中不包括动态接收者，所以编译器能够静态地进行一个基本检查来确定该动态调用是否能够成功执行。它会检查是否存在名称和参数数量已确定的函数。如果没有发现候选函数，那么会得到一个编译时错误。
            //例如：
            /*
            dynamic x = 5;
            Foo(x, x); // 编译错误——参数个数不符
            Fook(x); // 编译错误——无此方法名
            */
            Console.ReadKey();
        }
        static void Foo(int x) { Console.WriteLine("1"); }
        static void Foo(string x) { Console.WriteLine("2"); }
    }
}
